#include <stdio.h>
#include<string.h>

int pose;//声明全局变量,用于区分加解密,在47行与52行使用,第8行原理>>>>(+1)为加密,(-1)为解密

#define move 3//密码位移数为3
#define A 65 //A对应的ASCⅡ码,即65~90(A~Z)
#define a 97 //a对应的ASCⅡ码,即97~122(a~z)
int ed_cryption(int letter);//该函数用于加解密（letter为处理字符），实现方法：位移数3*(-1)与3*(+1)

int main(int argc, int *argv[])//函数实现的功能为读取文件，调用加解密函数，写入文件
//xxx -e 1.txt le.txt
//xxx -d le.txt 1.txt
{   
    if (strcmp(argv[1],"-e")+1){pose=1;}//加密,并修改pose参数值到1
    else if(strcmp(argv[1],"-d")+1){pose=-1;}//解密,并修改pose参数值到-1

    int ch;//输入到加解密的文本
    int c;//运行完加解密的文本，想不出什么名字，就叫c了>>>> :)
    FILE *fp_r;//fp_r为可读文件
    FILE *fp_w;//fp_r为可写文件


    fp_r = fopen(argv[2], "r");//可读
    fp_w = fopen(argv[3],"w+");//可写，追加写
 
    do 
    {
        ch = fgetc(fp_r);//逐一读取，一次一个
        int c =ed_cryption(ch);//执行加解密
        if(feof(fp_r))//如果为EOF(文章结尾)，跳出
        {
            break;
        }
        //printf("%c",c);
        fputc(c,fp_w);//写入文件
        //printf("%c",c);//调试用，输出文本
    }while(1);
    
    fclose(fp_r);//关闭文件
    fclose(fp_w);//并释放缓

    return 0;
}

int ed_cryption(int letter)//加解密函数
{   
    int cryption; //加解密后的结果
    
    if (65<=letter&&letter<=90)//字符时A~Z时。。。
    {cryption = (letter-A+26+move*pose)%26+A;//数学计算,当letter=65时(65-65+26+3)%26+65=3
    }

    else if(97<=letter&&letter<=122)//字符时a~z时。。。
    {cryption = (letter-a+26+move*pose)%26+a;//同理
    }

    else//字符时符号时
    {cryption = letter;//符号不做处理保留
    }

    return cryption;//返回修改后的ASCⅡ码

}